导航菜单
首页 >  XXE PHP代码审计入门指南  > PHP代码审计入门基础

PHP代码审计入门基础

PHP代码审计入门基础-PHP敏感函数速查表 2021/10/27 笔记 笔记PHPPHP敏感函数速查表

最近正在写一篇PHP代码审计的入门指南文档. 如果表格内出现遗漏或错误,欢迎大家私信反馈.

PHP一些容易出现安全问题的函数方法命令执行

一些常见的可以执行系统命令的函数/语法

函数/语法描述例子system执行命令并输出结果system(‘id’);exec执行命令 只可获取最后一行结果exec(‘id’,$a); print_r($a);passthru同 systempassthru(‘id’);shell_exec ` (反引号)执行命令并返回结果$a=shell_exec(‘id’);print_r($a); $a=`id`;print_r($a);popen执行命令并建立管道 返回一个指针 使用fread等函数操作指针进行读写$a=popen(“id”, “r”); echo fread($a, 2096);proc_open同 popen (进程控制功能更强大)见PHP手册pcntl_exec执行命令 只返回是否发生错误pcntl_exec(‘id’);代码注入/文件包含函数/语法结构描述例子eval将传入的参数内容作为PHP代码执行 eval 不是函数 是一种语法结构 不能当做函数动态调用eval(‘phpinfo();’);assert将传入的参数内容作为PHP代码执行 版本在PHP7以下是函数 PHP7及以上为语法结构assert(‘phpinfo();’);preg_replace当preg_replace使用/e修饰符且原字符串可控时时 有可能执行php代码echo preg_replace(“/e”,”{${PHPINFO()}}”,”123”);call_user_func把第一个参数作为回调函数调用 需要两个参数都完全可控才可利用 只能传入一个参数调用call_user_func(‘assert’, ‘phpinfo();’);call_user_func_array同call_user_func 可传入一个数组带入多个参数调用函数call_user_func_array (‘file_put_contents’, [‘1.txt’,’6666’]);create_function根据传递的参数创建匿名函数,并为其返回唯一名称 利用需要第二个参数可控 且创建的函数被执行$f = create_function(‘’,’system($_GET[123]);’); $f();include包含并运行指定文件 执行出错会抛出错误include ‘vars.php’; (括号可有可无)require同include 执行出错会抛出警告require(‘somefile.php’); (括号可有可无)require_once同require 但会检查之前是否已经包含该文件 确保不重复包含include_once同include 但会检查之前是否已经包含该文件 确保不重复包含SQL/LDAP注入函数/方法备注mysql_queryodbc_execmysqli_querymysql_db_querymysql_unbuffered_query

mysqli::query

用法

$mysqli = new mysqli(“localhost”, “my_user”, “my_password”, “world”);

$mysqli->query();

pg_querypg_query_paramspg_send_querypg_send_query_paramssqlsrv_query

pdo::query

$pdo=new PDO(“mysql:host=localhost;dbname=phpdemo”,”root”,”1234”); $pdo->query($sql);;

PDO

SQLite3::query

SQLite3::exec

$db = new SQLite3(‘mysqlitedb.db’); $db->query(‘SELECT bar FROM foo’); $db->exec(‘CREATE TABLE bar (bar STRING)’);

$mongo = new mongoclient(); $data = $coll->find($data);https://wooyun.js.org/drops/Mongodb%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB.html$ld = ldap_connect(“localhost”);…. $lb = @ldap_bind($ld, “cn=test,dc=test,dc=com”, “test”);https://www.cnblogs.com/0nc3/p/12063436.htmlDb::queryThinkphpDb::executeThinkphp文件读取/SSRF函数描述例子file_get_contents读入文件返回字符串echo file_get_contents(“flag.txt”); echo file_get_contents(“https://www.bilibili.com/");curl_setopt curl_execCurl访问url获取信息function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_exec($ch); curl_close($ch); } $url = $_GET[‘url’]; curl($url); https://www.php.net/manual/zh/function.curl-exec.phpfsockopen打开一个套接字连接(远程 tcp/udp raw)https://www.php.net/manual/zh/function.fsockopen.phpreadfile读取一个文件,并写入到输出缓冲同file_get_contentsfopen/fread/fgets/fgetss /fgetc/fgetcsv/fpassthru/fscanf打开文件或者 URL 读取文件流$file = fopen(“test.txt”,”r”); echo fread($file,”1234”); fclose($file);file把整个文件读入一个数组中echo implode(‘’, file(‘https://www.bilibili.com/'));highlight_file/show_source语法高亮一个文件highlight_file(“1.php”);parse_ini_file读取并解析一个ini配置文件print_r(parse_ini_file(‘1.ini’));simplexml_load_file读取文件作为XML文档解析文件上传/写入/其他函数描述例子file_put_contents将一个字符串写入文件file_put_contents(“1.txt”,”6666”);move_uploaded_file将上传的临时文件移动到新的位置move_uploaded_file($_FILES[“pictures”][“tmp_name”],”1.php”)rename重命名文件/目录rename($oldname, $newname);rmdir删除目录mkdir创建目录unlink删除文件copy复制文件copy($file, $newfile);fopen/fputs/fwrite打开文件或者 URLhttps://www.php.net/manual/zh/function.fwrite.phplink创建文件硬

相关推荐: